package com.example.interaction;

import com.example.util.CommonUtils;

import java.util.concurrent.CompletableFuture;

/**
 * RunToEither：两个异步任务，当有一个任务完成之后得到一个通知；无返回结果。
 * 注意：两个 CompletableFuture 需要是相同类型。
 */
public class RunToEitherDemo {
    public static void main(String[] args) {
        CommonUtils.printThreadLog("main start");

        CommonUtils.printThreadLog("张三下班准备回家。");
        CommonUtils.printThreadLog("张三等待 101, 102 路公交。");

        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            CommonUtils.printThreadLog("101 路公交在路上。");
            CommonUtils.sleepSecond(3);
            CommonUtils.printThreadLog("101 路公交到站了。");
            return "101";
        });

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            CommonUtils.printThreadLog("102 路公交在路上。");
            CommonUtils.sleepSecond(2);
            CommonUtils.printThreadLog("102 路公交到站了。");
            return "102";
        });

        CompletableFuture<Void> future = future1.runAfterEither(future2, () -> {
            CommonUtils.printThreadLog("张三坐上公交");
        });

        CommonUtils.printThreadLog("main continue");

        future.join();

        CommonUtils.printThreadLog("main end");
    }
}
